package SERVLET;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import DTO.AutorDTO;
import DTO.AutorLivroDTO;
import DTO.ObraDTO;

public class ColecaoServlet extends GenericObraServlet{
						
	@Override
	protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		if (request.getParameter("acao") != null) {
            if (request.getParameter("acao").equals("ExcluirLivro")) {
                excluirLivro(request, response);
            } else {
            	super.processRequest(request, response);            	
            }
		}
	}

	@Override
	protected void adicionarAutor(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.getSession().setAttribute("redirecionar", "retornarColecao");
		super.adicionarAutor(request, response);
	}
	
	@Override
	protected void removerListas(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
		request.getSession().removeAttribute("livrosObra");
        request.getSession().removeAttribute("livros");
		super.removerListas(request, response);
	}
		
	@Override
	protected void novo(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.getSession().setAttribute("livros", obraBO.pesquisarTodosLivros());
		request.getSession().removeAttribute("livrosObra");
		super.novo(request, response);
	}
	
	@Override
	protected void pesquisar(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		obraDTO.setTitulo(request.getParameter("pesquisa"));
    	request.getSession().setAttribute("colecoes", obraBO.pesquisarColecoesPorTitulo(obraDTO));            	
        redicionarPesquisar(request, response);
	}
	
	@Override
	protected void editar(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		obraDTO.setCodigo(Long.parseLong(request.getParameter("id")));
        obraDTO = obraBO.pesquisarPorCodigo(obraDTO.getCodigo());
		request.getSession().setAttribute("livrosObra", obraBO.pesquisarLivrosDaColecao(obraDTO));
        request.getSession().setAttribute("livros", obraBO.naoPesquisarLivrosDaColecao(obraDTO));
		super.editar(request, response);
	}
	
	@Override
	protected void incluir(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String oldOne = obraDTO.getTitulo();
        criarObjeto(request);                
        if (!obraBO.existe(obraDTO) || (isAlterando() && obraDTO.getTitulo().equals(oldOne))) {
            if (isIncluindo() ? obraBO.incluir(obraDTO) : isAlterando() ? obraBO.alterar(obraDTO) : false) {
            	obraDTO = obraBO.pesquisarPorTitulo(obraDTO.getTitulo());            	
            	for(ObraDTO o : livros){
            		o.setObra(obraDTO);
            		obraBO.alterar(o);
            	}
            	
                for(AutorDTO a : autores){    
                	AutorLivroDTO autorLivroDTO = new AutorLivroDTO();
                    autorLivroDTO.setObra(obraDTO);                            
                	autorLivroDTO.setAutor(a);
                	autorLivroBO.incluir(autorLivroDTO);
                }                
                
                alterando = incluindo = false;        
                request.getSession().removeAttribute("autoresObra");
                request.getSession().removeAttribute("autores");
                request.getSession().removeAttribute("livrosObra");
                request.getSession().removeAttribute("livros");
                request.getSession().setAttribute("colecoes", obraBO.pesquisarTodasColecoes());
                redicionarPesquisarRemoverAtributo(request, response);
            }
        }
	}
	
	@Override
	protected void visualizar(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.getSession().setAttribute("livrosObra", obraBO.pesquisarLivrosDaColecao(obraDTO));
		super.visualizar(request, response);
	}
		
	protected void excluirLivro(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		ObraDTO obra = obraBO.pesquisarPorCodigo(Long.parseLong(request.getParameter("id")));
		obra.setObra(obraBO.pesquisarPorCodigo(1l));
		obraBO.alterar(obra);
		request.getSession().setAttribute("obraDTO", obraDTO);
		request.getSession().setAttribute("livrosObra", obraBO.pesquisarLivrosDaColecao(obraDTO));
        request.getSession().setAttribute("livros", obraBO.naoPesquisarLivrosDaColecao(obraDTO));
        livros = new ArrayList<>();
        setAlterando(true);
        setIncluindo(false);
        redicionarIncluirAlterarRemoverAtributo(request, response);
	}
			
	@Override
	protected void redicionarPesquisar(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.getRequestDispatcher(HomeServlet.paginas.get("colecaoPesquisar")).forward(request, response);
	}
	
	@Override
	protected void redicionarIncluirAlterar(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.getRequestDispatcher(HomeServlet.paginas.get("colecaoIncluirAlterar")).forward(request, response);
	}
	
	@Override
	protected void redicionarVisualizar(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
		request.getRequestDispatcher(HomeServlet.paginas.get("colecaoVisualizar")).forward(request, response);
	}
	
	@Override
	protected void redicionarPesquisarAtualizarLista(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		removerAtributo(request);
		request.getSession().setAttribute("colecoes", obraBO.pesquisarTodasColecoes());
		request.getRequestDispatcher(HomeServlet.paginas.get("colecaoPesquisar")).forward(request, response);		
	}
}